from django.shortcuts import render
from django import http
from django.views import View
from django.core.cache import cache

from meiduo_mall.utils.response_code import RETCODE
from .models import Area


class AreaView(View):
    """省市区数据查询"""
    def get(self, request):
        # 1. 获取查询参数
        area_id = request.GET.get('area_id')

        # 如果没有area_id查询,说明要查询所有省数据
        if area_id is None:
            # 优先从redis查询所有省数据
            provinces_list = cache.get('provinces_list')
            # 如果从redis中没有查询到所有省数据
            if provinces_list is None:
                # 获取所有省数据
                provinces_qs = Area.objects.filter(parent=None)
                # 定义一个列表用来保存所有省字典数据
                provinces_list = []
                # 遍历查询集将模型转字典并保存到列表中
                for provinces_model in provinces_qs:
                    provinces_list.append({
                        'id': provinces_model.id,
                        'name': provinces_model.name
                    })
                # 将所有省数据列表缓存到redis
                cache.set('provinces_list', provinces_list, 3600)
            return http.JsonResponse({'province_list': provinces_list, 'code': RETCODE.OK, 'errmsg': 'OK'})
        else:

            # 先从redis查询数据,如果没有再从mysql查询
            sub_data = cache.get('sub_data_%s' % area_id)
            # 如果有area_id ,就查询指定行政区的下级所有行政
            if sub_data is None:
                try:
                    # 查询area_id指定行政区(省/市)
                    parent_model = Area.objects.get(id=area_id)
                    # 获取指定行政区的下级所有行政区
                    sub_qs = parent_model.subs.all()

                    # 定义一个列表变量用来保存下级所有行政区字典
                    sub_list = []
                    # 遍历查询集将下级行政区模型转换成字典并添加到列表中
                    for sub_model in sub_qs:
                        sub_list.append({
                            'id': sub_model.id,
                            'name': sub_model.name
                        })

                    # 定义一个大字典用来包装指定行政区及下级所有行政区
                    sub_data = {
                        'id': parent_model.id,
                        'name': parent_model.name,
                        'subs': sub_list
                    }
                    # 将数据缓存到redis
                    cache.set('sub_data_%s' % area_id, sub_data, 3600)
                except Area.DoesNotExist:
                    return http.HttpResponseForbidden('area_id不存在')
            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_data': sub_data})

